#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@author Luis Shou
@date: 1/12/14
@obs: Módulo que contem a classe e metodos
      responsáveis por criar os gráficos da aplicação.
"""

import getData
import pylab as p
import numpy as np
import matplotlib.pyplot as plt

class Graphics(object):
        """

        Classe que cria um gráfico, recorrendo ao matplotlib, 
        de acordo com a @statistic, @startYear e @endYear recebidos.
        
        @param	statistic	Tipo de estatistica desejado.
        @param	startYear	Primeiro ano que a estatistica irá mostrar
        @param	endYear		Ultimo ano que a estatistica irá mostrar
        
        """
        def __init__(self, statistic, startYear = None, endYear = None):
                super(Graphics, self).__init__()

                self.statistic = statistic
                
                self.startYear = startYear
                self.endYear = endYear

                self.data = getData.GetData()

                self.first_index = self.data.get_years_col().index(self.startYear)
                self.last_index = self.data.get_years_col().index(self.endYear)
 
                self.xValues = []

                
                for x in self.data.get_years_col():
                        if (x >= self.startYear) & (x <= self.endYear):
                                self.xValues.append(x)
                                pass
                        pass

		#cria o gráfico a partir do tipo de estatistica escolhido
                if self.statistic == "ipc":
                        self.ipcGraph()
                        pass
                elif self.statistic == "tInflacao":
                        self.tInflacaoGraph()
                        pass
                elif self.statistic =="rMinMensal":
                        self.rMinMensalGraph()
                        pass
                elif self.statistic == "rMaxMensal":
                        self.rMaxMensalGraph()
                        pass
                elif self.statistic == "evolRemMinMaxMensal":
                        self.evolRemMinMaxMensalGraph()
                        pass
                elif self.statistic == "PIBanual":
                        self.PIBanualGraph()
                        pass
                elif self.statistic == "RNBanual":
                        self.RNBanualGraph()
                        pass
                elif self.statistic == "RDBanual":
                        self.RDBanualGraph()
                        pass
                elif self.statistic == "remuneracoesAnuais":
                        self.remuneracoesAnuaisGraph()
                        pass
                
        def stringToInt(self, array):
                """
                Converte um array de strings num array de inteiros
                """
                new_array = []

                for x in xrange(len(array)):
                        new_array.append(int(array[x]))
                        pass
                return new_array
                pass

        def getArraySelectedYears(self, array):
                """
                Devolve um array com os anos selecionados.
                """
                
                values = []
                for x in xrange(self.first_index, self.last_index + 1):
                        values.append(float(array[x]))
                        pass

                return values

                pass

        def ipcGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Índice de preços ao consumidor (IPC)
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_ipc_col())
                
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Índice de preços ao consumidor')
                ax.set_xlabel('Anos')
                ax.set_title(u'IPC ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='medium')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def tInflacaoGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Taxa de inflação
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_inflation_rate_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Taxa de inflação')
                ax.set_xlabel('Anos')
                ax.set_title(u'Taxa de inflação ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def rMinMensalGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Remuneração mínima mensal dos funcionários públicos
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_minimum_monthly_pay_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Remuneração mínima mensal')
                ax.set_xlabel('Anos')
                ax.set_title(u'Remuneração mínima mensal dos funcionários públicos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def rMaxMensalGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Remuneração máxima mensal dos funcionários públicos
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_maximum_monthly_pay_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Remuneração máxima mensal')
                ax.set_xlabel('Anos')
                ax.set_title(u'Remuneração máxima mensal dos funcionários públicos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def evolRemMinMaxMensalGraph(self):
                """
                Cria o gráfico da estatística escolhida: 
                Evolução das remunerações máximas e mínimas mensais dos funcionários públicos a preços
                constantes
                """
                fig = p.figure()
                ax = fig.add_subplot(111)

                yValues_minimum = self.getArraySelectedYears(self.data.get_minimum_monthly_pay_col())
                yValues_maximum = self.getArraySelectedYears(self.data.get_maximum_monthly_pay_col())

                N = len(yValues_minimum)
                ind = np.arange(N)
                barWidth = 0.3
                
                plot_minimum = ax.bar(ind, yValues_minimum, barWidth, color="blue")

                plot_maximum = ax.bar(ind + barWidth, yValues_maximum, barWidth, color="green")
                
                ax.set_title(u'Evolução das remunerações máximas e mínimas mensais \n dos funcionários públicos a preços constantes')
                ax.set_xticks(ind+barWidth)

                ax.set_xticklabels(self.xValues, rotation=90, size='small')

                ax.legend( (plot_minimum[0], plot_maximum[0]), (u'Remuneração mínima mensal', u'Remuneração máxima mensal') )
                
                # self.autoLabel(plot, ax)

                plt.grid()
                plt.show()
                pass

        def PIBanualGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Produto interno bruto anual (PIB) per capita
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_pib_per_capita_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'PIB per capita')
                ax.set_xlabel('Anos')
                ax.set_title(u'PIB per capita ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def RNBanualGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Rendimento nacional anual bruto per capita
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_rnb_per_capita_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Rendimento nacional bruton per capita')
                ax.set_xlabel('Anos')
                ax.set_title(u'Rendimento nacional bruton per capita ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def RDBanualGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Rendimento disponível anual bruto per capita
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_rdb_per_capita_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Rendimento disponível anual bruto per capita')
                ax.set_xlabel('Anos')
                ax.set_title(u'Rendimento disponível anual bruto per capita ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass

        def remuneracoesAnuaisGraph(self):
                """
                Cria o gráfico da estatística escolhida:
                Remunerações per capita anuais
                """
                fig = p.figure()
                ax = fig.add_subplot(111)
                yValues = self.getArraySelectedYears(self.data.get_per_capita_annual_remuneration_col())
                N = len(yValues)
                ind = range(N)
                barWidth = 0.5
                plot = ax.bar(self.stringToInt(self.xValues), yValues, align = 'center')
                ax.set_ylabel(u'Remunerações per capita anuais')
                ax.set_xlabel('Anos')
                ax.set_title(u'Remunerações per capita anual ao longo dos anos')
                ax.set_xticks(self.stringToInt(self.xValues))

                ax.set_xticklabels(self.xValues, rotation=90, size='small')
                
                # self.autoLabel(plot, ax)

                p.grid()
                p.show()
                pass
